/*
 * SoapUI, Copyright (C) 2004-2017 SmartBear Software
 *
 * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent 
 * versions of the EUPL (the "Licence"); 
 * You may not use this work except in compliance with the Licence. 
 * You may obtain a copy of the Licence at: 
 * 
 * http://ec.europa.eu/idabc/eupl 
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the Licence is 
 * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
 * express or implied. See the Licence for the specific language governing permissions and limitations 
 * under the Licence. 
 */

package com.eviware.soapui.security.ui;

import com.eviware.soapui.config.MalformedXmlAttributeConfig;
import com.eviware.soapui.config.MalformedXmlConfig;
import com.eviware.x.form.XFormField;
import com.eviware.x.form.XFormFieldListener;
import com.eviware.x.form.support.ADialogBuilder;
import com.eviware.x.form.support.AField;
import com.eviware.x.form.support.AField.AFieldType;
import com.eviware.x.form.support.AForm;
import com.eviware.x.impl.swing.JFormDialog;
import com.eviware.x.impl.swing.JTextFieldFormField;

import javax.swing.JComponent;

public class MalformedXmlAdvancedSettingsPanel {

    private JFormDialog dialog;
    private MalformedXmlConfig configuration;
    private MalformedXmlAttributeConfig attributeConfig;

    public MalformedXmlAdvancedSettingsPanel(MalformedXmlConfig malformedXmlConfig) {
        this.configuration = malformedXmlConfig;
        this.attributeConfig = malformedXmlConfig.getAttributeMutation();

        dialog = (JFormDialog) ADialogBuilder.buildDialog(AdvancedSettings.class);

        initDialog();

        ((JTextFieldFormField) dialog.getFormField(AdvancedSettings.NEW_ELEMENT_VALUE)).setWidth(20);
        ((JTextFieldFormField) dialog.getFormField(AdvancedSettings.NEW_ATTRIBUTE_NAME)).setWidth(20);
        ((JTextFieldFormField) dialog.getFormField(AdvancedSettings.NEW_ATTRIBUTE_VALUE)).setWidth(20);
    }

    private void initDialog() {
        dialog.setBooleanValue(AdvancedSettings.INSERT_NEW_ELEMENT, configuration.getInsertNewElement());
        dialog.setValue(AdvancedSettings.NEW_ELEMENT_VALUE, configuration.getNewElementValue());
        dialog.setBooleanValue(AdvancedSettings.CHANGE_TAG_NAME, configuration.getChangeTagName());
        dialog.setBooleanValue(AdvancedSettings.LEAVE_TAG_OPEN, configuration.getLeaveTagOpen());
        dialog.setBooleanValue(AdvancedSettings.INSERT_INVALID_CHARACTER, configuration.getInsertInvalidCharacter());

        dialog.setBooleanValue(AdvancedSettings.MUTATE_ATTRIBUTES, attributeConfig.getMutateAttributes());
        dialog.setBooleanValue(AdvancedSettings.INSERT_INVALID_CHARS, attributeConfig.getInsertInvalidChars());
        dialog.setBooleanValue(AdvancedSettings.LEAVE_ATTRIBUTE_OPEN, attributeConfig.getLeaveAttributeOpen());
        dialog.setBooleanValue(AdvancedSettings.ADD_NEW_ATTRIBUTE, attributeConfig.getAddNewAttribute());
        dialog.setValue(AdvancedSettings.NEW_ATTRIBUTE_NAME, attributeConfig.getNewAttributeName());
        dialog.setValue(AdvancedSettings.NEW_ATTRIBUTE_VALUE, attributeConfig.getNewAttributeValue());

        // listeners...
        dialog.getFormField(AdvancedSettings.INSERT_NEW_ELEMENT).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                configuration.setInsertNewElement(Boolean.parseBoolean(newValue));
            }
        });
        dialog.getFormField(AdvancedSettings.NEW_ELEMENT_VALUE).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                configuration.setNewElementValue(newValue);
            }
        });
        dialog.getFormField(AdvancedSettings.CHANGE_TAG_NAME).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                configuration.setChangeTagName(Boolean.parseBoolean(newValue));
            }
        });
        dialog.getFormField(AdvancedSettings.LEAVE_TAG_OPEN).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                configuration.setLeaveTagOpen(Boolean.parseBoolean(newValue));
            }
        });
        dialog.getFormField(AdvancedSettings.MUTATE_ATTRIBUTES).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                attributeConfig.setMutateAttributes(Boolean.parseBoolean(newValue));
            }
        });
        dialog.getFormField(AdvancedSettings.INSERT_INVALID_CHARS).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                attributeConfig.setInsertInvalidChars(Boolean.parseBoolean(newValue));
            }
        });
        dialog.getFormField(AdvancedSettings.LEAVE_ATTRIBUTE_OPEN).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                attributeConfig.setLeaveAttributeOpen(Boolean.parseBoolean(newValue));
            }
        });
        dialog.getFormField(AdvancedSettings.ADD_NEW_ATTRIBUTE).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                attributeConfig.setAddNewAttribute(Boolean.parseBoolean(newValue));
            }
        });
        dialog.getFormField(AdvancedSettings.NEW_ATTRIBUTE_NAME).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                attributeConfig.setNewAttributeName(newValue);
            }
        });
        dialog.getFormField(AdvancedSettings.NEW_ATTRIBUTE_VALUE).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                attributeConfig.setNewAttributeValue(newValue);
            }
        });
        dialog.getFormField(AdvancedSettings.INSERT_INVALID_CHARACTER).addFormFieldListener(new XFormFieldListener() {

            @Override
            public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                configuration.setInsertInvalidCharacter(Boolean.parseBoolean(newValue));
            }
        });

    }

    public JComponent getPanel() {
        return dialog.getPanel();
    }

    @AForm(description = "Malformed XML Configuration", name = "Malformed XML Configuration")
    protected interface AdvancedSettings {

        @AField(description = "", name = "Insert new element", type = AFieldType.BOOLEAN)
        public final static String INSERT_NEW_ELEMENT = "Insert new element";

        @AField(description = "", name = "New element value", type = AFieldType.STRING)
        public final static String NEW_ELEMENT_VALUE = "New element value";

        @AField(description = "", name = "Change tag name", type = AFieldType.BOOLEAN)
        public final static String CHANGE_TAG_NAME = "Change tag name";

        @AField(description = "", name = "Leave tag open", type = AFieldType.BOOLEAN)
        public final static String LEAVE_TAG_OPEN = "Leave tag open";

        @AField(description = "", name = "Insert invalid char in xml", type = AFieldType.BOOLEAN)
        public final static String INSERT_INVALID_CHARACTER = "Insert invalid char in xml";

        @AField(description = "", name = "Mutate attributes", type = AFieldType.BOOLEAN)
        public final static String MUTATE_ATTRIBUTES = "Mutate attributes";

        @AField(description = "", name = "Insert invalid chars in attribute", type = AFieldType.BOOLEAN)
        public final static String INSERT_INVALID_CHARS = "Insert invalid chars in attribute";

        @AField(description = "", name = "Leave attribute open", type = AFieldType.BOOLEAN)
        public final static String LEAVE_ATTRIBUTE_OPEN = "Leave attribute open";

        @AField(description = "", name = "Add new attribute", type = AFieldType.BOOLEAN)
        public final static String ADD_NEW_ATTRIBUTE = "Add new attribute";

        @AField(description = "", name = "New attribute name", type = AFieldType.STRING)
        public final static String NEW_ATTRIBUTE_NAME = "New attribute name";

        @AField(description = "", name = "New attribute value", type = AFieldType.STRING)
        public final static String NEW_ATTRIBUTE_VALUE = "New attribute value";

    }

    public void release() {
        dialog.release();
        dialog = null;
        configuration = null;
        attributeConfig = null;
    }

}
